package br.unicamp.ic.sgct.client.apresentacao.ucs;

import java.util.List;

import br.unicamp.ic.sgct.client.aplicacao.conferencia.ConferenciaListener;
import br.unicamp.ic.sgct.client.aplicacao.usuario.UsuarioListener;
import br.unicamp.ic.sgct.client.aplicacao.usuario.UsuarioListener.HandlerObterParticipanteConferencia;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewDadosTrabalho;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewListaAvaliacao;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewListaConferencia;
import br.unicamp.ic.sgct.client.apresentacao.views.ViewListaTrabalho;
import br.unicamp.ic.sgct.client.dominio.to.AvaliacaoTO;
import br.unicamp.ic.sgct.client.dominio.to.ConferenciaTO;
import br.unicamp.ic.sgct.client.dominio.to.ParticipanteTO;
import br.unicamp.ic.sgct.client.dominio.to.TrabalhoTO;

import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.DecoratedTabPanel;

public class TrabalhosSubmetidoScreen  extends BaseConferenciaScreen {

	private static final String STYLE_ERROR = null;
	private int eventsToSink;
	
	private ConferenciaTO conferencia = null;
	private ConferenciaListener controladoraConferencia = null;
	private UsuarioListener controladoraLogin = null;
	private TrabalhoTO trabalho = null;

	//construtores so de exemplo
	private ViewListaConferencia viewListaConferencia = new ViewListaConferencia("Confer\u00eancias Abertas", 0, new ViewListaConferencia.HandlerClickListaConferencia() {
		
		@Override
		public void handle(ConferenciaTO to) {
			conferencia = to;
            controladoraLogin.getMensagemWidget().limparMensagem();
            showLoading(true);
            
            controladoraLogin.obterParticipanteConferencia(conferencia, new HandlerObterParticipanteConferencia() {
				
				@Override
				public void handleSucesso(ParticipanteTO result, ConferenciaTO to) {
					
					if (result == null){
						controladoraConferencia.setMensagemErro("Usu\u00e1rio n\u00e3o est\u00e1 inscrito como participante.");
					}
					else{
						viewListaTrabalho.montar(result.getTrabalhos()) ;
						panelTabOpcoes.selectTab(1);
						showLoading(false);
					}
				}
				
				@Override
				public void handleErro(Throwable caught) {
					showLoading(false);
                    controladoraConferencia.setMensagemErro(caught.getMessage());
					
				}
			});
		}
	});
	
	private ViewListaTrabalho viewListaTrabalho = new ViewListaTrabalho("Trabalhos Submetidos", 1, new ViewListaTrabalho.HandlerClickListaTrabalho() {
		
		@Override
		public void handle(TrabalhoTO to) {
			try{
				trabalho = to;			
				viewDadosTrabalho.montar(trabalho);
				viewListaAvaliacao.montar(trabalho.getAvaliacoes());
				panelTabOpcoes.selectTab(2);
				showLoading(false);	
			}
			catch (Exception e)
			{
				controladoraConferencia.setMensagemErro(e.getMessage());
			}
			
		}
	});
	
	private ViewListaAvaliacao viewListaAvaliacao = new ViewListaAvaliacao("Lista de Avalia\u00e7\u00e3o", 3, new ViewListaAvaliacao.HandlerClickListaAvaliacao() {

        @Override
        public void handle(AvaliacaoTO to) {
            Window.alert("Not supported yet.");
        }
    });
	
	private ViewDadosTrabalho viewDadosTrabalho = new ViewDadosTrabalho("Dados Trabalho", 2).add(viewListaAvaliacao);		
	
	@Override
	protected DecoratedTabPanel initPanelTabOpcoes() {
		panelTabOpcoes = new DecoratedTabPanel();
		panelTabOpcoes.add(viewListaConferencia, viewListaConferencia.getStrTabTitle());
        panelTabOpcoes.add(viewListaTrabalho, viewListaTrabalho.getStrTabTitle());
        panelTabOpcoes.add(viewDadosTrabalho, viewDadosTrabalho.getStrTabTitle());

        panelTabOpcoes.selectTab(0);
        panelTabOpcoes.setWidth("750px");
        panelTabOpcoes.setAnimationEnabled(true);
        
        panelTabOpcoes.addSelectionHandler(new SelectionHandler<Integer>() {
			
			@Override
			public void onSelection(SelectionEvent<Integer> event) {
				Integer item = (Integer) event.getSelectedItem();
				
				if (item == 0){
					viewListaTrabalho.getStrTabTitle().setVisible(false);
					viewDadosTrabalho.getStrTabTitle().setVisible(false);
					viewListaAvaliacao.getStrTabTitle().setVisible(false);
					conferencia = null;
					trabalho = null;
				}
				else if (item == 1) {
					if (conferencia == null) {
                        panelTabOpcoes.selectTab(0);
                        controladoraConferencia.setMensagemErro("Selecione uma Confer\u00eancia");
                    }
					else {
						viewListaTrabalho.getStrTabTitle().setVisible(true);
						viewDadosTrabalho.getStrTabTitle().setVisible(false);
						viewListaAvaliacao.getStrTabTitle().setVisible(false);
						trabalho = null;
					}
				}
				else if (item == 2){
					if (conferencia == null) {
                        panelTabOpcoes.selectTab(0);
                        controladoraConferencia.setMensagemErro("Selecione uma Confer\u00eancia");
                    }
					else if (trabalho == null){
						panelTabOpcoes.selectTab(1);
						controladoraConferencia.setMensagemErro("Selecione um Trabalho Submetido");
					}
					else
					{
						viewListaTrabalho.getStrTabTitle().setVisible(true);
						viewDadosTrabalho.getStrTabTitle().setVisible(true);
						viewListaAvaliacao.getStrTabTitle().setVisible(true);
					}
				}
				else if (item == 3){
					//Analisar...
				}
				
			}
		});
		
		// TODO Auto-generated method stub
		return panelTabOpcoes;
	}
	
	@Override
    public void load() {
        this.controladoraLogin.getMensagemWidget().limparMensagem();
        this.panelTabOpcoes.selectTab(0);
		conferencia = null;
		trabalho = null;
    }

	public TrabalhosSubmetidoScreen(final ConferenciaListener conferenciaListener, 
			                        final UsuarioListener usuarioListener){
		super();		
		this.controladoraConferencia = conferenciaListener;
		this.controladoraLogin = usuarioListener;
		this.initWidget(super.initPanel(controladoraConferencia));
		
		showLoading(true);
        controladoraConferencia.listarConferenciasAbertas(new ConferenciaListener.HandlerListarConferenciasAbertas() {

            @Override
            public void handleSucesso(List<ConferenciaTO> listTo) {
                showLoading(false);
                if (listTo.isEmpty()) {
                    controladoraConferencia.setMensagemErro("N\u00e3o há confer\u00eancia disponível para cancelamento de inscri\u00e7\u00e3oo");
                } else {
                    viewListaConferencia.montar(listTo);
                }
            }

            @Override
            public void handleErro(Throwable caught) {
                showLoading(true);
                controladoraConferencia.setMensagemErro("InscricaoScreen " + caught.getMessage());
            }
        });
	}
}
